package com.itheima.book.controller;


import com.itheima.book.domain.Book;
import com.itheima.book.service.BookService;

import java.util.Scanner;

// 这个BaseController就是一个模板类
public abstract class BaseController {

    // 调用BookService提供的方法(addBook)，把Book对象作为参数传递过去
//   private BookService bookService = new BookService() ;

    /**
     * 1. 定义一个方法(start)，提供用户选择界面,接收键盘录入数据，根据键盘录入的数据执行相关的业务操作
     * 2. 定义录入图书信息的方法(inputBookInfo)，接收键盘录入数据(bookId , bookName,publishDate,price)
     * 3. 将图书信息封装到Book对象中，调用BookService提供的方法(addBook)，把Book对象作为参数传递过去
     */
    // 定义一个方法(start)
    public void start(){

        while(true) {

            // 调用打印界面的方法
            printView() ;

            // 调用用户选择操作的方法
            userSelect();
        }
    }
    // 用户选择操作的方法
    public void userSelect() {
        // 接收键盘录入数据
        System.out.println("请输入您的选择：");
        Scanner scanner = new Scanner(System.in) ;
        String next = scanner.next();

        // 判断用户的选择
        switch (next) {
            case "1" :
                inputBookInfo();
                break;
            case "2" :
                deleteByBookId();
                break;
            case "3" :
                updateBookByBookId();
                break;
            case "4" :
                findAll();
                break;
            case "5" :
                System.out.println("欢迎下次继续使用......");
                System.exit(0)  ;   // 退出jvm
                break;
            default:
                System.out.println("不存在您所输入的选择，请重新输入....");
                break;
        }


    }

    /**
     * 1. 定义修改图书方法(updateBookByBookId)，接收键盘录入数据(bookId), 调用BookService方法判断录入的bookId是否存在
     * 2. 如果不存在就继续录入，如果存在录入图书的其他数据
     * 3. 将新录入的数据封装到图书对象中(Book)
     * 4. 调用BookService的方法(updateBookByBookId)，把Book对象传递过去，完成图书信息的修改操作
     */
    public void updateBookByBookId(){

        while(true) {

            // 接收键盘录入数据(bookId)
            System.out.println("请您输入一个图书的id");
            Scanner sc = new Scanner(System.in) ;
            String bookId = sc.next();

            // 调用BookService方法判断录入的bookId是否存在
            BookService bookService = new BookService() ;
            boolean result = bookService.isExistsBookId(bookId);
            if(result) {        // 这个BookId是存在的

                System.out.println("请您输入图书的名称");
                String bookName = sc.next();

                System.out.println("请您输入图书的发布时间");
                String publishDate = sc.next();

                System.out.println("请您输入价格");
                String price = sc.next();

                // 把用户输入的图书信息进行封装
                Book book = new Book();
                book.setBookId(bookId);
                book.setBookName(bookName);
                book.setPublishDate(publishDate);
                book.setPrice(price);

                // 调用BookService的方法(updateBookByBookId)
                bookService.updateBookByBookId(book);

                System.out.println("修改图书成功.............");

                // 结束循环
                break;

            }else {             // 不存在
                System.out.println("您录入的bookId是不存在的，请重新录入....");
            }

        }



    }


    /**
     * 1. 定义删除图书方法(deleteByBookId)，在方法内部接收键盘录入的数据(bookId)
     * 2. 调用BookService方法，判断该bookId是否存在，如果不存在就继续录入数据
     * 3. 如果存在就调用BookService中删除图书的方法（deleteByBookId）
     */
    public void deleteByBookId(){

        while(true) {

            // 在方法内部接收键盘录入的数据(bookId)
            System.out.println("请您输入一个图书的id");
            Scanner sc = new Scanner(System.in) ;
            String bookId = sc.next();

            // 创建BookService的对象
            BookService bookService = new BookService();

            // 如果返回的这个boolean类型的值是true，就说明存在
            // 如果返回的是false就说明不存在
            boolean existsBookId = bookService.isExistsBookId(bookId);
            if(existsBookId) {      // 存在进行图书的删除操作

                // 调用service层方法
                bookService.deleteByBookId(bookId);
                System.out.println("删除图书成功......");
                break;

            }else {                // 不存在，继续录入
                System.out.println("您录入的bookId是不存在的，请重新录入....");
            }

        }


    }


    /**
     * 1. 在BookController中定义一个方法(findAll),在findAll方法中调用BookService中的方法查询所有图书信息
     * 2. 将BookService中查询所有图书信息方法返回的数据在控制台输出
     */
    public void findAll() {

        // 创建BookService的对象
        BookService bookService = new BookService() ;

        // 调用BookService中的findAll方法
        Book[] books = bookService.findAllBook();

        // 遍历数组获取每一个元素，将其信息输出到控制台
        System.out.println("图书的id\t\t\t图书的名称\t\t\t发布时间\t\t\t价格"  );
        for(int x = 0 ; x < books.length ; x++) {
            Book bookInArr = books[x] ;
            if(bookInArr != null) {
                System.out.println(bookInArr.getBookId() + "\t\t\t" + bookInArr.getBookName() + "\t\t\t" + bookInArr.getPublishDate() + "\t\t\t" + bookInArr.getPrice());
            }
        }

    }


    // 接收键盘录入数据完成图书的添加方法
    public void inputBookInfo() {

        // 调用BookService提供的方法(addBook)，把Book对象作为参数传递过去
        BookService bookService = new BookService() ;

        // 接收键盘录入数据(bookId , bookName,publishDate,price)
        Scanner sc = new Scanner(System.in);

        String bookId = "" ;
        while(true) {

            System.out.println("请您输入bookId");
            bookId = sc.next();

            /**
             * 1. 在录入bookId的时候，需要调用service层的isExistsBookId方法
             * 2. 判断录入的bookId是否存在，如果存在就继续录入；如果不存在就结束录入
             */
            boolean result = bookService.isExistsBookId(bookId);
            if(result) {        // bookId是存在的
                // 重新进行录入
                System.out.println("您输入的图书id已经存在，请重新录入.....");
            }else {
                break;
            }

        }

        System.out.println("请您输入图书的名称");
        String bookName = sc.next();

        System.out.println("请您输入图书的发布时间");
        String publishDate = sc.next();

        System.out.println("请您输入价格");
        String price = sc.next();

        // 把用户输入的图书信息进行封装
        /**
         * 类和对象的关系： 一对多的关系
         */
        Book book = new Book();
        book.setBookId(bookId);
        book.setBookName(bookName);
        book.setPublishDate(publishDate);
        book.setPrice(price);


        boolean result = bookService.addBook(book);
        if(result) {        // 添加成功了
            System.out.println("图书信息添加成功了....");
        }else {
            System.out.println("图书信息添加失败了....");
        }

    }

    // 打印界面的方法
    public abstract void printView() ;

    /**
     * 既然这个方法的方法体是空的，那么我们还有没有必须去定义这个方法体呢？很显然是没有必要的，那么没有必须我们就可以直接把这对"{}"
     * 去掉；
     */

}

